﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using EntidadesDeNegocio;
using Utiles.Observer;
using Utiles.Excepcion;

namespace ObliDisenoAplicaciones.Interfaz
{
    public partial class ABM_Produccion : Form,IObservador
    {
        public delegate void CargarGrillaDelegate(object obj);
        public delegate void EstadoControlesFinProduccionDelegate(object obj);

        public ABM_Produccion()
        {
            InitializeComponent();            
            Sistema.Instancia.AgregarObservador(this);
            FormClosing += new FormClosingEventHandler(ABM_Produccion_FormClosing);
            txtSegundosProduccion.Text = Sistema.Instancia.SegundosProduccion.ToString();
            txtCantidadDisenosProducir.Text = Sistema.Instancia.CantidadRobotAProducir.ToString();
            Sistema.Instancia.EventoDeLogueoDeProduccion += new Sistema.EventoDeLogueoEnPantallaProduccion(Instancia_EventoDeLogueoDeProduccion);
            CargoGrilla(this);
        }
        /// <summary>
        /// Se loguea la producción
        /// </summary>
        /// <param name="prod"></param>
        /// <param name="texto"></param>
        public void Instancia_EventoDeLogueoDeProduccion(Produccion prod, string texto)
        {
            if (this.InvokeRequired)
            {
                this.Invoke(new Action(() =>
                {
                    txtLog.Text += Sistema.Instancia.LogProduccion(prod, texto);
                }));
            }
            else
                txtLog.Text += Sistema.Instancia.LogProduccion(prod, texto);
            
        }
        
        /// <summary>
        /// Metodo que desregistra el observador
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void ABM_Produccion_FormClosing(object sender, FormClosingEventArgs e)
        {
            Sistema.Instancia.EliminarObservador(this);
        }

        private void btnAgregar_Click(object sender, EventArgs e)
        {
            AgregarModificarProduccion ventana = new AgregarModificarProduccion();
            ventana.ShowDialog();
        }
        /// <summary>
        /// Fila seleccionada por el usuario
        /// </summary>
        /// <returns></returns>
        private DataGridViewRow FilaSeleccionada()
        {
            try
            {
                DataGridViewRow filaSeleccionada = dGVProduciones.SelectedRows[0];
                return filaSeleccionada;
            }
            catch (ArgumentOutOfRangeException)
            {
                MessageBox.Show("Debe seleccionar una fila completa para eliminar la producción", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return null;
            }
        }
        /// <summary>
        /// Evento del botón eliminar
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnEliminar_Click(object sender, EventArgs e)
        {       
            if (FilaSeleccionada() != null)
            {
                Sistema.Instancia.EliminarProduccion(int.Parse(FilaSeleccionada().Cells[0].Value.ToString()));
                CargoGrilla(null);
            }          
        }
        /// <summary>
        /// Carga grilla 
        /// </summary>
        public void CargoGrilla(object obj) 
        {
            if (this.InvokeRequired)
            {
                this.Invoke(new CargarGrillaDelegate(this.CargoGrilla),obj);
                
            }
            else
            {
                this.dGVProduciones.AutoGenerateColumns = false;
                BindingSource repositorio = new BindingSource();
                repositorio.DataSource = Sistema.Instancia.ListaProduccionesOrdenada();
                this.dGVProduciones.DataSource = repositorio;
                this.dGVProduciones.Refresh();                
            }
        }
        /// <summary>
        /// Actualizar la información
        /// </summary>
        /// <param name="obj"></param>
        public void Actualizar(Observable obj)
        {
            CargoGrilla(null);            
        }
        /// <summary>
        /// Produce los diseños
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>       
        private void btnComenzarProduccion_Click(object sender, EventArgs e)
        {
            
            if (validarCampo(txtCantidadDisenosProducir.Text) && validarCampo(txtSegundosProduccion.Text))
            {

                if (Sistema.Instancia.ExisteStockParaProduccion())
                {
                    //Verifica que los disenos a producir no necesiten Service                   
                    if (!Sistema.Instancia.ExistenDisenosParaService())
                    {
                        txtCantidadDisenosProducir.Enabled = false;
                        txtSegundosProduccion.Enabled = false;
                        Sistema.Instancia.CantidadRobotAProducir = int.Parse(txtCantidadDisenosProducir.Text);
                        Sistema.Instancia.SegundosProduccion = int.Parse(txtSegundosProduccion.Text);
                        Sistema.Instancia.CrearTimerProduccion();
                        btnComenzarProduccion.Enabled = false;
                        btnFinalizarProduccion.Enabled = true;
                    }
                    else
                    {
                        MessageBox.Show("Existen componentes del diseño que necesitan service","Error", MessageBoxButtons.OK, MessageBoxIcon.Error);                        
                    }                    
                }
                else
                {
                    MessageBox.Show("No existe stock suficiente para la producción", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);                        
                }
                
            }
        }        
        /// <summary>
        /// Finaliza el timer de Producción
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnFinalizarProduccion_Click(object sender, EventArgs e)
        {
            btnComenzarProduccion.Enabled = true;
            btnFinalizarProduccion.Enabled = false;
            txtSegundosProduccion.Enabled = true;
            txtCantidadDisenosProducir.Enabled = true;
            Sistema.Instancia.FinalizarProduccion();
        }
        /// <summary>
        /// Valida el campo string y que sea diferente a 0
        /// </summary>
        /// <param name="valor"></param>
        /// <returns></returns>
        private bool validarCampo(string valor) 
        {
            int res=0;
            try
            {
                res=int.Parse(valor);
                return res!=0;
            }
            catch 
            {
                MessageBox.Show("Formato incorrecto de los campos ingresados", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return false;
            }
        }
        /// <summary>
        /// Estado de controles cuando se finaliza la producción
        /// </summary>
        /// <param name="obj"></param>
        private void EstadoControlesFinProduccion(object obj) 
        {
            if (this.InvokeRequired)
            {
                this.Invoke(new EstadoControlesFinProduccionDelegate(this.EstadoControlesFinProduccion), obj);

            }
            else
            {
                this.btnComenzarProduccion.Enabled = true;
                this.btnFinalizarProduccion.Enabled = false;
                this.txtSegundosProduccion.Enabled = true;
                this.txtCantidadDisenosProducir.Enabled = true;
            } 
            
        }
        
    }
}
